#include "evt_handle.h"


#include "evtqueue.h"
#include "../utils/kfifo.h"
#include <pthread.h>
#include <stdio.h>
#include "../utils/macro_config.h"


static pthread_mutex_t evtq_mutex;
DECLARE_KFIFO(evtq_buf,  evt_t, 1024);

void evtqueue_init() {
    pthread_mutex_init(&evtq_mutex, NULL);
    INIT_KFIFO(evtq_buf);
    printf("evtqueue_init: avail=%d\n", kfifo_avail(&evtq_buf));
}

void evtqueue_fini() {
    pthread_mutex_destroy(&evtq_mutex);
}

int evtqueue_write(const  evt_t* evt, int force) {
    pthread_mutex_lock(&evtq_mutex);
    int n = kfifo_in(&evtq_buf, evt, 1);
    if (n == 0) {
        if (force) {
            // fprintf(stderr, "force evtqueue_write()");
            static  evt_t dummy = {0};
            kfifo_out(&evtq_buf, &dummy, 1);
            n = kfifo_in(&evtq_buf, evt, 1);
        } else {
            fprintf(stderr, "!! evtqueue_write error: evtq_buf is full\n");
        }
    }
    pthread_mutex_unlock(&evtq_mutex);
    return n;
}

int evtqueue_read( evt_t* evt, int n) {
    pthread_mutex_lock(&evtq_mutex);
    int r = kfifo_out(&evtq_buf, evt, n);
    pthread_mutex_unlock(&evtq_mutex);
    return r;
}



static void handle_event( evt_t *evt, time_t now);

 int handle_events(time_t now) {
     evt_t evts[32];
    int n = evtqueue_read(evts, 32);
    for (int i = 0; i < n; i++) {
        handle_event(&evts[i], now);
        if (evts[i].EvtKind == EVT_EXIT) {
            info_log("event: exit");
            return -1;
        }
    }
    return n;
}





/**
 * @brief 处理事件队列相关内容，主要是处理屏幕显示的相关事件。考虑处理这些事件后统一的点亮屏幕 通知ui。
 * 
 * @param evt 
 * @param now 
 */
static void handle_event( evt_t *evt, time_t now) 
{

    switch (evt->EvtKind) 
    {
        case EVT_FIRE: {
        
            break;
        }
        case EVT_ALARM: {
        
            break;
        }
        case EVT_RECOM: {
        
            break;
        }

        case EVT_ACTIVE: {
            
            break;
        }

        case EVT_FEEDBACK: {
            
            break;
        }

        case EVT_SUPERVISE: {
        
            break;
        }

        case EVT_FAULT: {
        
            break;
        }

        case EVT_SCHIELD: {
        
            break;
        }
        case EVT_OTHER: {
            
            break;
        }
   
        default:
            break;
    }
}





















